#ifndef SUDOKU_H
#define SUDOKU_H

#include "sudokulib_global.h"
#include <vector>
#include <map>


namespace sudoku {

    class SUDOKULIB_EXPORT Sudoku
    {
    public:
        Sudoku();
        virtual ~Sudoku();

        /**
         * @brief generateSolution 生成完整的数独解
         * @return
         */
        std::vector<std::vector<int>> generateSolution();

        /**
         * @brief generatePuzzle    根据难度生成数独谜题
         * @param difficulty    难度
         * @return
         */
        std::vector<std::vector<int>> generatePuzzle(int difficulty);

        /**
         * @brief isValid   检查在指定位置放置数字是否有效
         * @param board     数独解的棋盘
         * @param row       行
         * @param col       列
         * @param num       数字
         * @return
         */
        bool isValid(const std::vector<std::vector<int>> & board, int row, int col, int num);

    private:
        // std::vector<std::vector<int>> m_board;

        /**
         * @brief solveSudoku   回溯法求解数独
         * @param board         数独解的棋盘
         * @return
         */
        bool solveSudoku(std::vector<std::vector<int>> & board);


        /**
         * @brief removeNumbers 从完整解中移除数字以生成谜题
         * @param board     数独解的棋盘
         * @param count     移除数字的个数
         */
        void removeNumbers(std::vector<std::vector<int>>& board, int count);
    };

}

#endif // SUDOKU_H
